/************************
*  工具函数模块           *
*  作者: QH              *
*  date: 2019.05.13     *
************************/

/** 
 * 时间戳格式化函数 
 * @param  {object}           时间对象
 * @return {string}           格式化的时间字符串 
 */
function formatDate(now) {
    var year = now.getFullYear()
    var month = now.getMonth() + 1
    var date = now.getDate()
    var hour = now.getHours()
    var minute = now.getMinutes()
    var second = now.getSeconds()
    return year + "-" + month + "-" + date + " " + hour + ":" + minute + ":" + second
}
/** 
 * 时间戳格式化函数             年月日
 * @param  {object}           时间对象
 * @return {string}           格式化的时间字符串 
 */
function formatDateTwo(now) {
    var year = now.getFullYear()
    var month = now.getMonth() + 1
    var date = now.getDate()
    return year + "-" + month + "-" + date
}
/** 
 * 数组是否被包含 
 * @param  {array}           大的数组
 * @param  {array}           被包含的数组
 * @return {bool}           a是否包含b true:是 false: 否
 */
function isContained(a, b) {
    if (!(a instanceof Array) || !(b instanceof Array)) return false
    if (a.length < b.length) return false;
    var aStr = a.toString()
    for(var i = 0, len = b.length; i < len; i++) {
        if(aStr.indexOf(b[i]) == -1) return false
    }
    return true
}

/** 
 * 求数组并集 
 * @param  {array}           a数组
 * @param  {array}           b数组
 * @return {array}           a数组与b数组的并集数组
 */
function union (a, b) {
    return a.concat(b.filter(v => !a.includes(v)))
}

/** 
 * 求数组交集 
 * @param  {array}           a数组
 * @param  {array}           b数组
 * @return {array}           a数组与b数组的交集数组
 */
function intersection (a, b) {
    return a.filter(v => b.includes(v))
}

/** 
 * 求数组差集 
 * @param  {array}           大的数组
 * @param  {array}           小的数组
 * @return {array}           大数组与小数组的差集数组
 */
function difference (a, b) {
    return a.concat(b).filter(v => a.includes(v) && !b.includes(v))
}

/** 
 * 树形结构转化为平级数组函数 
 * @param  {array}           树形数据
 * @return {array}           格式化后的数据
 */
function treeToArray (data) {
    let tmp = []
    Array.from(data).forEach((record, index) => {
        tmp.push(record)
        if (record.children && record.children.length > 0) {
            const children = this.treeToArray(record.children)
            tmp = tmp.concat(children)
        }
    })
    return tmp
}

/** 
 * 校验经度 
 * @param  {string}          经度
 * @return {boolean}         是否符合要求
 */
function checkLong (value) {
    var longrg = /^(\-|\+)?(((\d|[1-9]\d|1[0-7]\d|0{1,3})\.\d{0,6})|(\d|[1-9]\d|1[0-7]\d|0{1,3})|180\.0{0,6}|180)$/
    if(!longrg.test(value)) {
        return false
    }
    return true
}

/** 
 * 校验纬度 
 * @param  {string}          纬度
 * @return {boolean}         是否符合要求
 */
function checkLat (value) {
    var latreg = /^(\-|\+)?([0-8]?\d{1}\.\d{0,6}|90\.0{0,6}|[0-8]?\d{1}|90)$/
    if(!latreg.test(value)) { 
        return false
    }
    return true
}
/** 
 * 时间比较函数                05:30 06:40
 * @param  {string}           时间
 * @param  {string}           时间
 * @return {string}           '<', '>', '='
 */
function compareTime (time1, time2) {
    const T1 = {
        h: parseInt(time1.split(':')[0]),
        m: parseInt(time1.split(':')[1])
    }
    const T2 = {
        h: parseInt(time2.split(':')[0]),
        m: parseInt(time2.split(':')[1])
    }
    if (T1.h > T2.h) return '>'
    if (T1.h < T2.h) return '<'
    if (T1.h === T2.h) {
        if (T1.m > T2.m) return '>'
        if (T1.m < T2.m) return '<'
        if (T1.m === T2.m) return '='
    }
}
/** 
 * 日期比较函数               
 * @param  {string}           日期
 * @param  {string}           日期
 * @return {boolean}          date1是否大于或等于date2  是: true  否: false
 */
function compareDate (date1, date2) {
    let oDate1 = new Date(date1)
    let oDate2 = new Date(date2)
    return oDate1.getTime() >= oDate2.getTime()
}

export default {
    formatDate,
    formatDateTwo,
    isContained,
    union,
    intersection,
    difference,
    treeToArray,
    checkLong,
    checkLat,
    compareTime,
    compareDate
}
